package com.example.employeemanagement.mapper;

import com.example.employeemanagement.dto.AttendanceListDto;
import com.example.employeemanagement.entry.Attendance;
import com.example.employeemanagement.vo.AttendanceVo;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 考勤数据访问接口
 * 使用MyBatis注解方式实现考勤记录的CRUD操作
 */
@Mapper
public interface AttendanceMapper {

    /**
     * 插入考勤记录
     * @param vo 包含考勤信息的VO对象
     */
    void insert(AttendanceVo vo);

    /**
     * 查询所有考勤记录
     * @return 考勤记录列表
     */
    List<AttendanceVo> selectAll();

    /**
     * 根据ID查询考勤记录
     * @param id 考勤记录ID
     * @return 考勤记录VO对象
     */
    Attendance selectById(int id);
    /**
     * 更新考勤记录
     * @param vo 包含更新后考勤信息的VO对象
     */
    int update(AttendanceVo vo);

    /**
     * 删除考勤记录
     * @param id 要删除的考勤记录ID
     */
    void delete(Integer id);
    
    /**
     * 根据员工ID查询所有考勤记录
     * @param employeeId 员工ID
     * @return 考勤记录列表
     */
    List<Attendance> selectByEmployeeId(@Param("employeeId") int employeeId);
    
    /**
     * 分页查询考勤记录总数
     * 支持按姓名、工号、部门和考勤状态进行模糊查询
     * @param employeeName 员工姓名（可选）
     * @param employeeId 员工工号（可选）
     * @param department 部门名称（可选）
     * @param status 考勤状态（可选）
     * @return 符合条件的记录总数
     */
    long countForPageQuery(@Param("employeeName") String employeeName, 
                          @Param("employeeId") Integer employeeId, 
                          @Param("department") String department, 
                          @Param("status") String status);
    
    /**
     * 分页查询考勤记录
     * 支持按姓名、工号、部门和考勤状态进行模糊查询
     * @param employeeName 员工姓名（可选）
     * @param employeeId 员工工号（可选）
     * @param department 部门名称（可选）
     * @param status 考勤状态（可选）
     * @param offset 偏移量
     * @param limit 每页大小
     * @return 考勤记录列表
     */
    List<AttendanceListDto> pageQuery(@Param("employeeName") String employeeName, 
                                    @Param("employeeId") Integer employeeId, 
                                    @Param("department") String department, 
                                    @Param("status") String status, 
                                    @Param("offset") int offset, 
                                    @Param("limit") int limit);
}